
package br.com.aeternu.controleatendimento.atendimento;

import java.awt.Frame;
import java.awt.Rectangle;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.table.DefaultTableModel;
import org.apache.log4j.Logger;
import br.com.aeternu.controleatendimento.atendimento.ui.IfcUIAtendimento;
import br.com.aeternu.controleatendimento.atendimento.ui.UIAtendimento;
import br.com.aeternu.controleatendimento.common.ifc.IfcMensagemUsuario;
import br.com.aeternu.controleatendimento.common.ui.EasyJFrame;
import br.com.aeternu.controleatendimento.common.ui.EasyOptionPane;
import br.com.aeternu.controleatendimento.excel.atendimento.AtendimentoBean;
import br.com.aeternu.controleatendimento.excel.atendimento.ExcelAtendimento;
import br.com.aeternu.controleatendimento.exception.ControleAtendimentoException;
import br.com.aeternu.controleatendimento.exportacao.Exportacao;
import br.com.aeternu.controleatendimento.util.FormatUtil;

/**
 * Realiza as operações relacionadas aos atendimentos registrados.
 * <P>
 * Responsável por incluir novos atendimentos, alterá-los e exportá-los quando necessário.
 * 
 * @author Janeiro/2014: Junio de Souza Fernandes <DD>
 */
public class Atendimento implements IfcUIAtendimento, IfcFormAtendimento
{

   /** Registra as operações do sistema em arquivo */
   private static Logger logger = Logger.getLogger(Atendimento.class);
   /** Formato padrão de data (dd/MM/yyyy) */
   private DateFormat dateFormat;
   /** Tratamento dos registro de atendimento na planilha do Excel */
   private ExcelAtendimento excel;

   /**
    * Cria uma nova instância do tipo <CODE>Atendimento</CODE>.
    * <P>
    * Essa nova instância automaticamente inicializa os dados e a tela onde esses dados são apresentados para edição. Também é possível a
    * adição de novos registros; a seleção do período desejado e exportação dos dados em relatório específico.
    * 
    * @throws ControleAtendimentoException
    */
   public Atendimento() throws ControleAtendimentoException
   {
      this.excel = new ExcelAtendimento();
      this.dateFormat = new SimpleDateFormat(FormatUtil.DATE_FORMAT);

      UIAtendimento ui = new UIAtendimento(this);
      carregaTela(ui);
      atualizaList(ui);
   }

   @Override
   public void atualizaPlanilha(EasyJFrame ui, int row, int column, Object newValue)
   {
      UIAtendimento uiAtendimento = (UIAtendimento) ui;

      try
      {
         List<AtendimentoBean> atendimentoBeanList = excel.obterRegistros((String) uiAtendimento.getPeriodo().getSelectedItem());
         AtendimentoBean bean;

         if (!atendimentoBeanList.isEmpty())
         {
            try
            {
               bean = atendimentoBeanList.get(row);
            }
            catch (IndexOutOfBoundsException e)
            {
               // Lista não está vazia, porém o índice solicitado (row) ainda não foi preenchido
               bean = new AtendimentoBean();
            }
         }
         else
         {
            bean = new AtendimentoBean();
         }

         switch (column)
         {
            case 0:
               bean.setDataAtendimento((Date) newValue);
               break;
            case 1:
               bean.setTurno((String) newValue);
               break;
            case 2:
               bean.setMedico((String) newValue);
               break;
            case 3:
               bean.setPaciente((String) newValue);
               break;
            case 4:
               bean.setTipoDeExame((String) newValue);
               break;
            case 5:
               bean.setCoordenacao((String) newValue);
               break;
            case 6:
               bean.setEmpresaParceira((String) newValue);
               break;
            case 7:
               bean.setParticular((String) newValue);
               break;
            case 8:
               bean.setConclusaoPendencia((String) newValue);
               break;
            case 9:
               bean.setQuantidade((Integer) newValue);
               break;
         }

         excel.atualiza(bean);
         carregaTela(uiAtendimento);
         atualizaList(uiAtendimento);
      }
      catch (ControleAtendimentoException e)
      {
         logger.error(e.getMessage(), e);
         EasyOptionPane.showErrorMessageDialog(uiAtendimento, e.getMessage());
      }
   }

   @Override
   public void excluirRegistro(UIAtendimento ui)
   {
      EasyOptionPane.showInfoMessageDialog(ui, IfcMensagemUsuario.INFO_NAO_FUNCIONAL);
   }

   @Override
   public void exportarPeriodo(UIAtendimento ui)
   {
      try
      {
         Exportacao exportacao = new Exportacao((String) ui.getPeriodo().getSelectedItem());
         exportacao.exportarParaExcel();
      }
      catch (ControleAtendimentoException e)
      {
         logger.error(e.getMessage(), e);
         EasyOptionPane.showErrorMessageDialog(ui, e.getMessage());
      }
   }

   @Override
   public void incluirRegistro(UIAtendimento ui)
   {
      try
      {
         new FormAtendimento(ui, this);
      }
      catch (ControleAtendimentoException e)
      {
         logger.error(e.getMessage(), e);
         EasyOptionPane.showErrorMessageDialog(ui, e.getMessage());
      }
   }

   @Override
   public void trocaPeriodo(UIAtendimento ui)
   {
      try
      {
         atualizaList(ui);
      }
      catch (ControleAtendimentoException e)
      {
         logger.error(e.getMessage(), e);
         EasyOptionPane.showErrorMessageDialog(ui, e.getMessage());
      }
   }

   private void atualizaList(UIAtendimento ui) throws ControleAtendimentoException
   {
      DefaultTableModel model = (DefaultTableModel) ui.getTable().getModel();

      while (model.getRowCount() > 0)
      {
         for (int i = 0; i < model.getRowCount(); i++)
         {
            model.removeRow(i);
         }
      }

      List<AtendimentoBean> atendimentoBeanList = excel.obterRegistros((String) ui.getPeriodo().getSelectedItem());

      for (AtendimentoBean bean : atendimentoBeanList)
      {
         model.addRow(new Object[]{dateFormat.format(bean.getDataAtendimento()), bean.getTurno(), bean.getMedico(), bean.getPaciente(),
            bean.getTipoDeExame(), bean.getCoordenacao(), bean.getEmpresaParceira(), bean.getParticular(), bean.getConclusaoPendencia(),
            bean.getQuantidade()});
      }
   }

   private void carregaTela(UIAtendimento ui) throws ControleAtendimentoException
   {
      String selected = (String) ui.getPeriodo().getSelectedItem();
      List<String> periodoList = excel.obterPeriodos();
      DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>();
      for (String periodo : periodoList)
      {
         model.addElement(periodo);
      }
      ui.getPeriodo().setModel(model);
      if (selected != null)
      {
         ui.getPeriodo().setSelectedItem(selected);
      }
   }

   @Override
   public void incluirRegistro(Frame parent, AtendimentoBean bean)
   {
      UIAtendimento ui = (UIAtendimento) parent;

      DefaultTableModel model = (DefaultTableModel) ui.getTable().getModel();
      model.addRow(new Object[]{dateFormat.format(bean.getDataAtendimento()), bean.getTurno(), bean.getMedico(),
         bean.getPaciente(), bean.getTipoDeExame(), bean.getCoordenacao(), bean.getEmpresaParceira(),
         bean.getParticular(), bean.getConclusaoPendencia(), bean.getQuantidade()});

      int row = model.getRowCount() - 1;
      atualizaPlanilha(ui, row, 0, bean.getDataAtendimento());
      atualizaPlanilha(ui, row, 1, bean.getTurno());
      atualizaPlanilha(ui, row, 2, bean.getMedico());
      atualizaPlanilha(ui, row, 3, bean.getPaciente());
      atualizaPlanilha(ui, row, 4, bean.getTipoDeExame());
      atualizaPlanilha(ui, row, 5, bean.getCoordenacao());
      atualizaPlanilha(ui, row, 6, bean.getEmpresaParceira());
      atualizaPlanilha(ui, row, 7, bean.getParticular());
      atualizaPlanilha(ui, row, 8, bean.getConclusaoPendencia());
      atualizaPlanilha(ui, row, 9, bean.getQuantidade());

      Rectangle rect = ui.getTable().getCellRect(model.getRowCount(), model.getColumnCount(), true);
      ui.getTable().addRowSelectionInterval(model.getRowCount() - 1, model.getRowCount() - 1);
      ui.getTable().scrollRectToVisible(rect);
      ui.getTable().requestFocusInWindow();
   }
}
